#!/usr/bin/env node

/**
 * Pre-test check script
 * Validates that the environment is ready for testing
 * 自动处理配置文件缺失问题，让测试能正常运行
 */

const fs = require('fs');
const path = require('path');

// 项目根目录
const projectRoot = path.resolve(__dirname, '..');

// 基础结构检查
const structuralChecks = [
  {
    name: 'Test directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../tests'))
  },
  {
    name: 'Lib directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../lib'))
  },
  {
    name: 'Config directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../config'))
  }
];

// 可选测试目录检查（不阻止测试运行）
const optionalChecks = [
  {
    name: 'Unit test directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../tests/unit'))
  },
  {
    name: 'Integration test directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../tests/integration'))
  },
  {
    name: 'MCP test directory exists',
    check: () => fs.existsSync(path.join(__dirname, '../tests/mcp'))
  }
];

/**
 * 检查并自动创建配置文件
 */
function ensureConfigurationExists() {
  console.log('🔍 检查配置文件...');

  const ConfigPathResolver = require('../lib/config/config-path-resolver');
  const pathResolver = new ConfigPathResolver();
  const configPath = pathResolver.getConfigFilePath();

  // 检查配置文件是否存在
  if (fs.existsSync(configPath)) {
    console.log('✓ 配置文件已存在');
    return true;
  }

  console.log('⚠️  配置文件不存在，尝试自动创建...');

  try {
    // 检查是否有模板文件
    const templatePath = path.join(projectRoot, 'settings.json.example');
    if (fs.existsSync(templatePath)) {
      // 确保配置目录存在
      const configDir = path.dirname(configPath);
      if (!fs.existsSync(configDir)) {
        fs.mkdirSync(configDir, { recursive: true });
      }

      // 复制模板文件
      fs.copyFileSync(templatePath, configPath);
      console.log('✓ 已从模板创建配置文件');
      console.log(`📁 配置文件位置: ${configPath}`);
      console.log('💡 请在配置文件中添加有效的API密钥');
      return true;
    } else {
      console.log('❌ 未找到配置模板文件');
      return false;
    }
  } catch (error) {
    console.error('❌ 创建配置文件失败:', error.message);
    return false;
  }
}

/**
 * 检查配置文件的完整性（不阻止测试，只给出提示）
 */
async function checkConfigurationCompleteness() {
  console.log('🔍 检查配置完整性...');

  try {
    const ConfigManager = require('../config-manager');
    const configManager = new ConfigManager(projectRoot);

    // 使用异步方式检查配置状态（不进行API验证）
    const status = await configManager.getConfigurationStatus(false);

    if (status.hasConfigFile) {
      if (status.isConfigured) {
        console.log('✓ 配置完整有效');
        return true;
      } else {
        console.log('⚠️  配置文件存在但需要配置API密钥');
        if (status.placeholderIssues.length > 0) {
          console.log('   需要配置:', status.placeholderIssues.join(', '));
        }
        console.log('💡 部分依赖配置的测试可能会跳过');
        return true; // 不阻止测试运行
      }
    } else {
      console.log('❌ 配置文件不存在');
      return false;
    }
  } catch (error) {
    console.log('⚠️  无法检查配置完整性:', error.message);
    return true; // 不阻止测试运行
  }
}

/**
 * 主检查函数
 */
async function runPretestChecks() {
  console.log('🚀 执行测试前置检查...\n');

  let criticalFailures = [];
  let warnings = [];

  // 1. 基础结构检查（关键）
  console.log('📁 检查基础项目结构:');
  for (const { name, check } of structuralChecks) {
    try {
      const passed = check();
      if (passed) {
        console.log(`  ✓ ${name}`);
      } else {
        console.log(`  ✗ ${name} - FAILED`);
        criticalFailures.push(name);
      }
    } catch (error) {
      console.log(`  ✗ ${name} - ERROR: ${error.message}`);
      criticalFailures.push(`${name} (${error.message})`);
    }
  }

  // 2. 配置文件检查和自动创建
  console.log('\n⚙️  检查配置:');
  const configExists = ensureConfigurationExists();
  if (!configExists) {
    criticalFailures.push('无法创建配置文件');
  } else {
    await checkConfigurationCompleteness();
  }

  // 3. 可选结构检查（非关键）
  console.log('\n📂 检查可选测试目录:');
  for (const { name, check } of optionalChecks) {
    try {
      const passed = check();
      if (passed) {
        console.log(`  ✓ ${name}`);
      } else {
        console.log(`  - ${name} - 不存在（可选）`);
        warnings.push(name);
      }
    } catch (error) {
      console.log(`  - ${name} - ERROR: ${error.message}（可选）`);
      warnings.push(`${name} (${error.message})`);
    }
  }

  // 4. 总结结果
  console.log('\n' + '='.repeat(60));

  if (criticalFailures.length > 0) {
    console.log('❌ 发现关键问题，无法运行测试:');
    criticalFailures.forEach(failure => {
      console.log(`   • ${failure}`);
    });
    console.log('\n💡 请解决上述问题后重新运行测试');
    return false;
  }

  console.log('✅ 基础检查通过，可以运行测试');

  if (warnings.length > 0) {
    console.log('\n⚠️  注意事项（不影响测试运行）:');
    warnings.forEach(warning => {
      console.log(`   • ${warning}`);
    });
  }

  console.log('\n🎯 测试建议:');
  console.log('   • 不依赖API密钥的测试将正常运行');
  console.log('   • 需要真实API调用的测试可能会跳过');
  console.log('   • 如需完整测试体验，请配置有效的API密钥');

  if (warnings.length > 0 || !configExists || (await checkConfigurationCompleteness()) === false) {
    console.log('\n💡 快速配置指南:');
    console.log('   1. 运行设置向导: node scripts/setup-wizard.js');
    console.log('   2. 或手动编辑配置文件');
    console.log('   3. 配置完成后重新运行 npm test');
  }

  return true;
}

// 主执行逻辑
async function main() {
  try {
    const success = await runPretestChecks();

    if (success) {
      console.log('\n🚀 开始执行测试套件...\n');
      process.exit(0);
    } else {
      console.log('\n⏹️  测试已停止，请先解决关键问题\n');
      process.exit(1);
    }
  } catch (error) {
    console.error('\n❌ 前置检查执行失败:', error.message);
    process.exit(1);
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  main();
}